package com.tedu.api.list;

import org.testng.annotations.Test;

import java.util.*;

/**
 * Collection集合下   子集合【叫队列】
 * Queue       队列      单端队列
 * Deque       队列双端队列    “Deque接口---继承--Queue接口”
 * 作用：保存数据，有序存储和处理，功能：数据缓冲或者多线程协议奥工作
 *
 * 队列实现类：
 * LinkedList：双向链表
 */

public class QueueAPI {
    //Queue  队列   单端队列
    @Test
    public void testQueue(){
        //创建队列---多态--LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer()  ----add()一样
         * 作用：入队操作，队尾追加元素
         */
        queue.offer("总有一天你会来到我身边");
        queue.offer("晴天");
        queue.offer("过活");
        queue.offer("记忆停留");
        System.out.println("Queue队列："+queue);
        /**
         * poll()
         * 作用：出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();  //删除队首元素
        System.out.println("Queue队列："+queue);
        String str= queue.peek();
        System.out.println("Queue队列："+str);
        System.out.println("Queue队列："+queue);
        /**
         * 需求:1.遍历队列---while---只遍历一次队列【队列元素消失】
         * 提示：while  条件  拿到队列中总长度   size（）
         * 需求:2.遍历队列--增强for--队列元素不消失
         *提示：for  条件：Ee：队列
         *
         *
         *
         */
       for(String e :queue){
           System.out.println("队列元素"+e);
       }
       System.out.println("Queue队列"+queue);
    }
    //Deque   队列          双端队列--继承--单端队列
    @Test
    public void testDeque(){
        //创建Deque  双端队列   方法基本一致，部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("任贤齐");  deque.offer("王菲");
        deque.offer("毛阿敏");  deque.offer("那英");
        System.out.println("双端队列"+deque);
        //offerFirst()   队首添加元素    OfferLast（）  队尾添加元素
        deque.offerFirst("蔡徐坤");   deque.offer("薛之谦");
        System.out.println("双端队列【首尾添加元素】"+deque);
        //getFirst()   获取队首    getLast()   获取队尾
        System.out.println("获取队首"+deque.getFirst());
        System.out.println("获取队尾"+deque.getLast());
        //pollFirst() 获取队首，删除队列中队首  【单端：poll类似】
        //pollLast()  获取队尾，删除队列中队尾
        String xue=deque.pollLast();//删除“薛之谦元素”队列--队首
       System.out.println("队尾元素"+xue);
        System.out.println("双端队列"+deque);

    }
    /**
     * 找结构：业务中如果有后退【撤销】情况使用
     * 双端队列支持找结构--提供相应的方法实现找结构
     */
    @Test
    public void testStack(){
        //创建双端队列--支持找结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push()  Deque  独有的方法--支持找结构
         * --offer：Queue--add：Collection接口  【添加】
         * 作用：【添加：网站压入一个元素】 压栈操作
         */
        stack.push("夯大力");
        stack.push("恶搞之家");
        stack.push("喜羊羊");
        stack.push("魔方大厦");
        System.out.println("栈结构"+stack);
        /**
         * pop()  出栈一个尾元素
         */
        String last=stack.pop();
        System.out.println(""+last);
        System.out.println("栈结构："+stack);
        //面试题：pop，poll，peek的使用区别？
        /**
         *需求1：遍历栈结构--while--元素出栈，队列元素需要清空
         * 需求2：遍历找结构--增强for--元素遍历成功，队列元素不变
         */
        /**
         * 作业：1. 描述上面的区别
         * pop：  以功能为中心，性能较高，数据安全性较低适用于简单任务
         * Pull的特点主要包括：Java中，Pull方法的特点是被动接收数据。‌ 当需要获取数据或执行操作时，程序会主动调用Pull方法来获取所需的信息
         * peek： 返回包含原始元素的新流，不改变流的状态，调试和监视‌，‌执行副作用‌
         *      2. 遍历栈结构--while--元素出站，队列元素需要清空
         *      3。 遍历栈结构--增强for--元素遍历成功，队列元素不变
         */
      /*  while(stack.size()>0){
            String str= stack.pop();
                System.out.println("遍历："+str);
         }*/
     //   System.out.println("清空后的栈"+stack);
                         for(String i:stack)
            System.out.println("遍历："+i);
        }
    }










































